﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using QuanserClient;
using TankController.Dominio;

namespace TankController
{
    public partial class FormPrincipal : Form
    {
        private FormSelecionarConfiguracao formSelecionarConfiguracao;
        private FormConfigurarTipoA formConfigurarTipoA;
        private FormConfigurarTipoB formConfigurarTipoB;
        private FormConfigurarTipoC formConfigurarTipoC;
        private FormConfigurarTipoD formConfigurarTipoD;
        private IFormConfigurar formConfigurarAtual;
        private FormControleTipoA formControleTipoA;
        private FormControleTipoB formControleTipoB;
        private FormControleTipoC formControleTipoC;
        private FormControleTipoD formControleTipoD;
        private IFormControle formControleAtual;
        private FormSobre formSobre;

        private Grafico graficoEsquerda;
        private Grafico graficoDireita;

        //private IQuanserClient servidor;
        //private IPlanta planta;
        //private IEntrada entrada;
        //private IControlador controlador;

        public FormPrincipal()
        {
            InitializeComponent();
        }

        private void PrepararAmbiente()
        {
            if (Global.TipoConfiguracao != null)
            {
                switch (Global.TipoConfiguracao)
                {
                    case TipoConfiguracao.ConfiguracaoA:
                        formConfigurarAtual = formConfigurarTipoA;
                        formControleAtual = formControleTipoA;

                        configurarToolStripMenuItem_Click(plantaToolStripMenuItem, new EventArgs());

                        if (Global.Controlador1 != null)
                        {
                            controleToolStripMenuItem_Click(controlador1ToolStripMenuItem, new EventArgs());
                        }
                        else
                        {
                            this.Close();
                        }
                        break;
                    case TipoConfiguracao.ConfiguracaoB:
                        formConfigurarAtual = formConfigurarTipoB;
                        formControleAtual = formControleTipoB;

                        configurarToolStripMenuItem_Click(plantaToolStripMenuItem, new EventArgs());

                        if (Global.Controlador1 != null)
                        {
                            controleToolStripMenuItem_Click(controlador1ToolStripMenuItem, new EventArgs());
                        }
                        else
                        {
                            this.Close();
                        }
                        break;
                    case TipoConfiguracao.ConfiguracaoC:
                        formConfigurarAtual = formConfigurarTipoC;
                        formControleAtual = formControleTipoC;

                        configurarToolStripMenuItem_Click(plantaToolStripMenuItem, new EventArgs());

                        if (Global.Controlador1 != null)
                        {
                            controleToolStripMenuItem_Click(controlador1ToolStripMenuItem, new EventArgs());
                        }
                        else
                        {
                            this.Close();
                        }
                        break;
                    case TipoConfiguracao.ConfiguracaoD:
                        formConfigurarAtual = formConfigurarTipoD;
                        formControleAtual = formControleTipoD;

                        configurarToolStripMenuItem_Click(plantaToolStripMenuItem, new EventArgs());

                        if (Global.Controlador1 != null)
                        {
                            controleToolStripMenuItem_Click(controlador1ToolStripMenuItem, new EventArgs());
                        }
                        else
                        {
                            this.Close();
                        }
                        break;
                    default:
                        throw new ApplicationException("Tipo de configuração inválida.");
                }
            }
            else
            {
                this.Close();
            }

            //configurarToolStripMenuItem_Click(plantaToolStripMenuItem, new EventArgs());

            //if (Global.Controlador != null)
            //{
            //    controleToolStripMenuItem_Click(controladorToolStripMenuItem, new EventArgs());
            //}
            //else
            //{
            //    this.Close();
            //}
        }

        private void MontarComponentes()
        {
            formSelecionarConfiguracao = new FormSelecionarConfiguracao(this);
            formConfigurarTipoA = new FormConfigurarTipoA(this);
            formConfigurarTipoB = new FormConfigurarTipoB(this);
            formConfigurarTipoC = new FormConfigurarTipoC(this);
            formConfigurarTipoD = new FormConfigurarTipoD(this);
            formControleTipoA = new FormControleTipoA(this);
            formControleTipoB = new FormControleTipoB(this);
            formControleTipoC = new FormControleTipoC(this);
            formControleTipoD = new FormControleTipoD(this);
            formSobre = new FormSobre(this);

            graficoEsquerda = new Grafico(this, "Altura (cm)");
            graficoDireita = new Grafico(this, "Tensão (V)");

            spcPrincipal.Panel1.Controls.Add(graficoEsquerda);
            spcPrincipal.Panel2.Controls.Add(graficoDireita);
        }

        private void configurarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            TipoAba aba;

            if (sender == plantaToolStripMenuItem)
            {
                aba = TipoAba.Planta;
            }
            else if (sender == entradaToolStripMenuItem)
            {
                aba = TipoAba.Entrada;
            }
            else if (sender == controlador1ToolStripMenuItem)
            {
                aba = TipoAba.Controlador1;
            }
            else if (sender == controlador2ToolStripMenuItem)
            {
                aba = TipoAba.Controlador2;
            }
            else
            {
                throw new ApplicationException("Tipo de aba inválido.");
            }

            MostrarTelaConfigurar(aba);
        }

        private void sobreToolStripMenuItem_Click(object sender, EventArgs e)
        {
            DialogResult resultado = formSobre.ShowDialog(this);
        }

        private void controleToolStripMenuItem_Click(object sender, EventArgs e)
        {
            switch (Global.TipoConfiguracao.Value)
            {
                case TipoConfiguracao.ConfiguracaoA:
                    if (formControleTipoA.IsDisposed || formControleTipoA.Visible == false)
                    {
                        formControleTipoA = new FormControleTipoA(this);

                        formControleAtual = formControleTipoA;

                        formControleTipoA.Show(this);

                        controlador2ToolStripMenuItem.Enabled = false;
                    }
                    break;
                case TipoConfiguracao.ConfiguracaoB:
                    if (formControleTipoB.IsDisposed || formControleTipoB.Visible == false)
                    {
                        formControleTipoB = new FormControleTipoB(this);

                        formControleAtual = formControleTipoB;

                        formControleTipoB.Show(this);

                        controlador2ToolStripMenuItem.Enabled = false;
                    }
                    break;
                case TipoConfiguracao.ConfiguracaoC:
                    if (formControleTipoC.IsDisposed || formControleTipoC.Visible == false)
                    {
                        formControleTipoC = new FormControleTipoC(this);

                        formControleAtual = formControleTipoC;

                        formControleTipoC.Show(this);

                        controlador2ToolStripMenuItem.Enabled = true;
                    }
                    break;
                case TipoConfiguracao.ConfiguracaoD:
                    if (formControleTipoD.IsDisposed || formControleTipoD.Visible == false)
                    {
                        formControleTipoD = new FormControleTipoD(this);

                        formControleAtual = formControleTipoD;

                        formControleTipoD.Show(this);

                        controlador2ToolStripMenuItem.Enabled = false;
                    }
                    break;
                default:
                    throw new ApplicationException("Tipo de configuração inválida.");
            }
        }

        private void sairToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        /*internal IPlanta Planta
        {
            get { return planta; }
            set { planta = value; }
        }

        internal IControlador Controlador
        {
            get { return controlador; }
            set { controlador = value; }
        }

        internal IEntrada Entrada
        {
            get { return entrada; }
            set { entrada = value; }
        }

        public IQuanserClient Servidor
        {
            get { return servidor; }
            set { servidor = value; }
        }*/

        internal void Play()
        {
            Global.TempoInicio = DateTime.Now;

            lock (Global.MonitorStatus)
            {
                Global.Status = Status.Play;
            }

            Global.Planta.Servidor.Disconnect();
            Global.Planta.Servidor.Connect();

            graficoEsquerda.Iniciar();
            graficoDireita.Iniciar();

            Global.Controlador1.Iniciar();

            if (Global.TipoConfiguracao == TipoConfiguracao.ConfiguracaoC)
            {
                Global.Controlador2.Iniciar();
            }

            DesabilitarMenu();
        }

        internal void Stop()
        {
            lock (Global.MonitorStatus)
            {
                Global.Status = Status.Stop;
            }

            HabilitarMenu();
        }

        internal void AtualizarReferencia()
        {
            graficoEsquerda.AtualizarReferencia();
            graficoDireita.AtualizarReferencia();
        }

        private void HabilitarMenu()
        {
            menu.Enabled = true;
        }

        private void DesabilitarMenu()
        {
            menu.Enabled = false;
        }

        internal void MostrarTelaConfigurar(TipoAba aba)
        {
            DialogResult resultado = formConfigurarAtual.ExibirAba(aba);

            if (resultado == System.Windows.Forms.DialogResult.OK)
            {
                if (Global.TipoConfiguracao == TipoConfiguracao.ConfiguracaoC)
                {
                    graficoEsquerda.Preparar(Global.Controlador1.GetSinaisAltura().Concat(Global.Controlador2.GetSinaisAltura()).ToList());
                    graficoDireita.Preparar(Global.Controlador1.GetSinaisTensao().Concat(Global.Controlador2.GetSinaisTensao()).ToList());
                }
                else
                {
                    graficoEsquerda.Preparar(Global.Controlador1.GetSinaisAltura());
                    graficoDireita.Preparar(Global.Controlador1.GetSinaisTensao());
                }

                formControleAtual.AtualizarCampos();
            }
        }

        private void NewFormPrincipal_Shown(object sender, EventArgs e)
        {
            MontarComponentes();

            if (formSelecionarConfiguracao.IsDisposed || formSelecionarConfiguracao.Visible == false)
            {
                formSelecionarConfiguracao = new FormSelecionarConfiguracao(this);
            }

            formSelecionarConfiguracao.ShowDialog(this);

            PrepararAmbiente();
        }

        /*private void novaConfiguracaoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (formSelecionarConfiguracao.IsDisposed || formSelecionarConfiguracao.Visible == false)
            {
                formSelecionarConfiguracao = new FormSelecionarConfiguracao(this);
            }

            formSelecionarConfiguracao.ShowDialog(this);
        }*/

        private void configuracao1ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Global.TipoConfiguracao = TipoConfiguracao.ConfiguracaoA;

            formControleAtual.Close();

            Global.Controlador1 = null;

            PrepararAmbiente();
        }

        private void configuracao2EmMalhaUnicaToolStripMenuItem_Click(object sender, EventArgs e)
        {

            Global.TipoConfiguracao = TipoConfiguracao.ConfiguracaoB;

            formControleAtual.Close();

            Global.Controlador1 = null;

            PrepararAmbiente();
        }

        private void configuracao2ComDuasMalhasToolStripMenuItem_Click(object sender, EventArgs e)
        {

            Global.TipoConfiguracao = TipoConfiguracao.ConfiguracaoC;

            formControleAtual.Close();

            Global.Controlador1 = null;

            PrepararAmbiente();
        }

        private void configuracao2ComSeguidorDeReferenciaToolStripMenuItem_Click(object sender, EventArgs e)
        {

            Global.TipoConfiguracao = TipoConfiguracao.ConfiguracaoD;

            formControleAtual.Close();

            Global.Controlador1 = null;

            PrepararAmbiente();
        }
    }
}
